package edu.uoc.tds.pec4.vista;

import edu.uoc.tds.pec4.model.SS1_CentroDocente;
import edu.uoc.tds.pec4.model.SS1_Usuario;
import edu.uoc.tds.pec4.util.ExceptionUtils;
import edu.uoc.tds.pec4.util.LanguageUtils;
import edu.uoc.tds.pec4.vista.base.JPanelBase;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.rmi.RemoteException;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;
import javax.swing.table.DefaultTableModel;

/**
 * Tecnicas de Desarrollo de Software - (UOC)
 *
 * @author Grupo Magicsoftware
 * @version 1.0
 */
public class SS1_PanelConsultaUsuarios extends JPanelBase {private SS4_PantallaMenu padre;
    private JButton jb_buscar;
    private JButton jb_estado;
    private JButton jb_editar;
    private JButton jb_cancelar;
    private List<JLabel> labels;
    private List<JTextField> textfields;
    private JRadioButton rb_DocIdn;
    private JRadioButton rb_Filtrar;
    private ButtonGroup bg_TipoBusqueda;
    private JRadioButton rb_desacSi;
    private JRadioButton rb_desacNo;
    private ButtonGroup bg_desac;
    private JComboBox jcb_perfil;
    private JComboBox jcb_centro;
    private JComboBox jcb_tipoRol;
    private List<SS1_CentroDocente> centros;
    private List<JPanel> paneles;
    private List<String> nombresCentros;
    private JTable tabla;
    private List<SS1_Usuario> usuariosTabla;

    public SS1_PanelConsultaUsuarios(SS4_PantallaMenu padre) {
        super(new BorderLayout());
        this.padre = padre;
        iniciarComponentes();
    }

    private void iniciarComponentes(){
        jb_buscar = new JButton(LanguageUtils.getMessage
                ("SS1.Buscar"));
        jb_buscar.setFocusable(false);
        jb_editar = new JButton(LanguageUtils.getMessage
                ("SS1.Editar"));
        jb_editar.setFocusable(false);
        jb_estado = new JButton(LanguageUtils.getMessage
                ("SS1.Estado"));
        jb_estado.setFocusable(false);
        jb_cancelar = new JButton(LanguageUtils.getMessage
                ("SS1.Cancelar"));
        jb_cancelar.setFocusable(false);
        JPanel pSur = new JPanel();
        pSur.add(jb_editar);
        pSur.add(jb_estado);
        pSur.add(jb_cancelar);
        add(pSur, BorderLayout.SOUTH);

        labels = new ArrayList<JLabel>();
        for (int i = 0; i < 10;i++){
            JLabel l = new JLabel(LanguageUtils.getMessage
                ("SS1_PanelCU.label" + i));
            l.setFocusable(false);
            labels.add(l);
        }

        textfields = new ArrayList<JTextField>();
        for (int i = 0; i < 7;i++){
            JTextField tf = new JTextField();
            tf.setText("");
            tf.setColumns(10);
            textfields.add(tf);
        }

        rb_DocIdn = new JRadioButton(LanguageUtils.getMessage
                ("SS1_PanelCU.rb_DocIdn"));
        rb_DocIdn.setFocusable(false);
        rb_Filtrar = new JRadioButton(LanguageUtils.getMessage
                ("SS1_PanelCU.rb_Filtrar"));
        rb_Filtrar.setFocusable(false);
        rb_Filtrar.setSelected(true);
        rb_desacSi = new JRadioButton(LanguageUtils.getMessage
                ("SS1.Si"));
        rb_desacSi.setFocusable(false);
        rb_desacSi.setSelected(true);
        rb_desacNo = new JRadioButton(LanguageUtils.getMessage
                ("SS1.No"));
        rb_desacNo.setFocusable(false);
        bg_TipoBusqueda = new ButtonGroup();
        bg_TipoBusqueda.add(rb_DocIdn);
        bg_TipoBusqueda.add(rb_Filtrar);
        bg_desac = new ButtonGroup();
        bg_desac.add(rb_desacSi);
        bg_desac.add(rb_desacNo);
        String[] perfiles = {
            LanguageUtils.getMessage("SS1_PanelCU.Admin"),
            LanguageUtils.getMessage("SS1_PanelCU.PerSe"),
            LanguageUtils.getMessage("SS1_PanelCU.Asist"),
            LanguageUtils.getMessage("SS1_PanelCU.Cualquiera")
        };
        jcb_perfil = new JComboBox(perfiles);
        jcb_perfil.setSelectedIndex(3);
        jcb_perfil.setFocusable(false);

        try {
            centros = padre.getRemotoMantenimiento().getCentrosDocentes();
        } catch (SQLException ex) {
            ExceptionUtils.visualizarError(LanguageUtils.getMessage("ERR_SQL"));
        } catch (RemoteException ex) {
            ExceptionUtils.visualizarError(LanguageUtils.getMessage("ERR_Remote"));
        }
        nombresCentros = new ArrayList<String>();
        for (int i = 0;i < centros.size();i++) {
            nombresCentros.add(centros.get(i).getNombre());
        }
        jcb_centro = new JComboBox(nombresCentros.toArray());
        jcb_centro.addItem(LanguageUtils.getMessage("SS1_PanelCU.Cualquiera"));
        jcb_centro.setSelectedIndex(nombresCentros.size());
        jcb_centro.setFocusable(false);

        String[] roles = {
            LanguageUtils.getMessage("SS1.TipoRol1"),
            LanguageUtils.getMessage("SS1.TipoRol2"),
            LanguageUtils.getMessage("SS1.TipoRol3"),
            LanguageUtils.getMessage("SS1.TipoRol4"),
            LanguageUtils.getMessage("SS1_PanelCU.Cualquiera")
        };
        jcb_tipoRol = new JComboBox(roles);
        jcb_tipoRol.setSelectedIndex(4);
        jcb_tipoRol.setFocusable(false);

        String[][] filas = new String[8][5];
        tabla = new JTable(filas, getNombresColumnas());
        tabla.setCellSelectionEnabled(false);
        tabla.setFocusable(false);
        JScrollPane scrollPane = new JScrollPane(tabla);
        scrollPane.setPreferredSize(new Dimension(600, 200));
        scrollPane.setVerticalScrollBarPolicy
                (ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);

        JPanel pCentro = new JPanel();
        JPanel pDatos = new JPanel(new GridLayout(8, 1));
        paneles = new ArrayList<JPanel>();
        for (int i = 0; i < 8; i++) {
            paneles.add(new JPanel());
        }
        paneles.get(0).add(rb_DocIdn);
        paneles.get(1).add(textfields.get(0));
        paneles.get(2).add(rb_Filtrar);
        paneles.get(3).add(labels.get(0));
        paneles.get(3).add(jcb_perfil);
        paneles.get(4).add(labels.get(1));
        paneles.get(4).add(textfields.get(1));
        paneles.get(4).add(labels.get(2));
        paneles.get(4).add(textfields.get(2));
        paneles.get(4).add(labels.get(3));
        paneles.get(4).add(textfields.get(3));
        paneles.get(4).add(labels.get(4));
        paneles.get(4).add(textfields.get(4));
        paneles.get(5).add(labels.get(5));
        paneles.get(5).add(jcb_centro);
        paneles.get(5).add(labels.get(6));
        paneles.get(5).add(jcb_tipoRol);
        paneles.get(6).add(labels.get(7));
        paneles.get(6).add(textfields.get(5));
        paneles.get(6).add(labels.get(8));
        paneles.get(6).add(textfields.get(6));
        paneles.get(6).add(labels.get(9));
        paneles.get(6).add(rb_desacSi);
        paneles.get(6).add(rb_desacNo);
        paneles.get(7).add(jb_buscar);

        for (int i = 0; i < paneles.size(); i++) {
            pDatos.add(paneles.get(i));
        }
        pCentro.add(pDatos);
        pCentro.add(scrollPane);
        add(pCentro, BorderLayout.CENTER);
        jb_buscar.addActionListener(padre);
        jb_editar.addActionListener(padre);
        jb_estado.addActionListener(padre);
        jb_cancelar.addActionListener(padre);
        rb_DocIdn.addActionListener(padre);
        rb_Filtrar.addActionListener(padre);
        jcb_perfil.addActionListener(padre);
    }

    @Override
    public void componentePulsado(ActionEvent e) {
        if (e.getSource() == jb_buscar){
            configurarTabla();

        } else if (e.getSource() == jb_editar){
            editarTabla();

        } else if (e.getSource() == jb_estado){
            int[] r = tabla.getSelectedRows();

            for (int i = 0;i < r.length; i++) {
                if (r[i] < usuariosTabla.size()){
                    SS1_Usuario usuario = usuariosTabla.get(i);
                    usuario.setActivo(!usuario.isActivo());
                    try {
                        padre.getRemotoMantenimiento().updateUsuario(usuario.getId(), usuario);
                    } catch (SQLException ex) {
                        ExceptionUtils.visualizarError(LanguageUtils.getMessage("ERR_SQL"));
                    } catch (RemoteException ex) {
                        ExceptionUtils.visualizarError(LanguageUtils.getMessage("ERR_Remote"));
                    }
                }
            }
            jb_buscar.doClick();

        } else if (e.getSource() == jb_cancelar){
            padre.setPanelCentral(new SS4_PanelInicial());

        } else if (e.getSource() == rb_DocIdn){
            paneles.get(3).setVisible(false);
            paneles.get(4).setVisible(false);
            paneles.get(5).setVisible(false);
            paneles.get(6).setVisible(false);

        } else if (e.getSource() == rb_Filtrar){
            paneles.get(1).setVisible(false);

        } else if (e.getSource() == jcb_perfil){
            if (jcb_perfil.getSelectedIndex() == 2){
                labels.get(6).setVisible(false);
                jcb_tipoRol.setVisible(false);
            } else {
                labels.get(6).setVisible(true);
                jcb_tipoRol.setVisible(true);
            }
        }
    }

    private void configurarTabla(){
        DateFormat df = new SimpleDateFormat("dd/mm/yyyy");
        String condicion = "";
        String aux;

        if (rb_DocIdn.isSelected()){
            aux = textfields.get(0).getText();
            if (!aux.equals("")) {
                condicion = condicion.concat("numero_documento = '" + textfields.get(0).getText() + "'");
            }
        } else if (rb_Filtrar.isSelected()){
            if (jcb_perfil.getSelectedIndex() != 3){
                condicion = condicion.concat("tipo_usuario = '" + jcb_perfil.getSelectedIndex() + "'");
            }
            if (jcb_centro.getSelectedIndex() != nombresCentros.size()){
                if (!condicion.equals("")) condicion = condicion.concat(" AND ");
                condicion = condicion.concat("cod_CentroDocente = '" +
                    centros.get(jcb_centro.getSelectedIndex()).getId() + "'");
            }
            if (jcb_tipoRol.getSelectedIndex() != 4){
                if (!condicion.equals("")) condicion = condicion.concat(" AND ");
                condicion = condicion.concat("rol = '" + jcb_tipoRol.getSelectedIndex() + "'");
            }
            aux = textfields.get(1).getText();
            if (!aux.equals("")) {
                if (!condicion.equals("")) condicion = condicion.concat(" AND ");
                condicion = condicion.concat("nombre = ");
                condicion = condicion.concat("'" + aux + "'");
            }
            aux = textfields.get(2).getText();
            if (!aux.equals("")) {
                if (!condicion.equals("")) condicion = condicion.concat(" AND ");
                condicion = condicion.concat("apellido1 = ");
                condicion = condicion.concat("'" + aux + "'");
            }
            aux = textfields.get(3).getText();
            if (!aux.equals("")) {
                if (!condicion.equals("")) condicion = condicion.concat(" AND ");
                condicion = condicion.concat("apellido2 = ");
                condicion = condicion.concat("'" + aux + "'");
            }
            aux = textfields.get(4).getText();
            if (!aux.equals("")) {
                if (!condicion.equals("")) condicion = condicion.concat(" AND ");
                condicion = condicion.concat("codigo_postal = ");
                condicion = condicion.concat("'" + aux + "'");
            }
            aux = textfields.get(5).getText();
            if (!aux.equals("")) {
                try {
                    df.parse(aux);
                } catch (ParseException ex) {
                    ExceptionUtils.visualizarInformacion(LanguageUtils.getMessage("SS1_Mensaje7"));
                    return;
                }
                if (!condicion.equals("")) condicion = condicion.concat(" AND ");
                condicion = condicion.concat("fecha_alta >= ");
                condicion = condicion.concat("'" + aux + "'");
            }
            aux = textfields.get(6).getText();
            if (!aux.equals("")) {
                try {
                    df.parse(aux);
                } catch (ParseException ex) {
                    ExceptionUtils.visualizarInformacion(LanguageUtils.getMessage("SS1_Mensaje7"));
                    return;
                }
                if (!condicion.equals("")) condicion = condicion.concat(" AND ");
                condicion = condicion.concat("fecha_alta <= ");
                condicion = condicion.concat("'" + aux + "'");
            }

            if (rb_desacNo.isSelected()) {
                if (!condicion.equals("")) condicion = condicion.concat(" AND ");
                condicion = condicion.concat("activo = '1'");
            }
        }

        try {
            usuariosTabla = padre.getRemotoMantenimiento().getUsuarios(condicion);
        } catch (SQLException ex) {
            ExceptionUtils.visualizarError(LanguageUtils.getMessage("ERR_SQL"));
        } catch (RemoteException ex) {
            ExceptionUtils.visualizarError(LanguageUtils.getMessage("ERR_Remote"));
        }

        String[][] filas = new String[usuariosTabla.size()][5];
        for (int i = 0; i < usuariosTabla.size(); i++) {
            SS1_Usuario usuario = usuariosTabla.get(i);

            switch (usuario.getTipoUsuario()){
                case 0: filas[i][0] = LanguageUtils.getMessage("SS1_PanelCU.Admin"); break;
                case 1: filas[i][0] = LanguageUtils.getMessage("SS1_PanelCU.PerSe"); break;
                case 2: filas[i][0] = LanguageUtils.getMessage("SS1_PanelCU.Asist"); break;
            }
            
            filas[i][1] = usuario.getNombre();
            filas[i][2] = usuario.getApellido1() + " " + usuario.getApellido2();
            filas[i][2] = usuario.getCentroDocente().getNombre();
            if (usuario.isActivo()) filas[i][4] = LanguageUtils.getMessage("SS1.Si");
            else filas[i][4] = LanguageUtils.getMessage("SS1.No");
        }
        tabla.setModel(new DefaultTableModel(filas, getNombresColumnas()));
    }

    private void editarTabla(){
        int i = tabla.getSelectedRow();

        if (i != -1 && usuariosTabla != null){
            if (i < usuariosTabla.size()){
                SS1_Usuario usuario = usuariosTabla.get(i);
                SS1_PanelGestionarUsuario PanelGU =
                        new SS1_PanelGestionarUsuario(padre);
                PanelGU.setConsulta(this);
                PanelGU.setUsuario(usuario);
                padre.setPanelCentral(PanelGU);
            }
        }
    }
    
    private String[] getNombresColumnas(){
        String[] nombresColumnas = {
            LanguageUtils.getMessage("SS1_PanelCU.Perfil"),
            LanguageUtils.getMessage("SS1_PanelCU.Nombre"),
            LanguageUtils.getMessage("SS1_PanelCU.Apellidos"),
            LanguageUtils.getMessage("SS1_PanelCU.Centro"),
            LanguageUtils.getMessage("SS1_PanelCU.Activo")
        };
        return nombresColumnas;
    }
}